# -*- coding: utf-8 -*-
# AES加密
from base64 import decodebytes, b64encode
from Crypto.Cipher import AES


iv = '1234567887654321'  # 偏移量
key = '1234567887654321'  # 密钥
BLOCK_SIZE = 16


# 补足字节方法
def pad(value):
    count = len(value)
    if count % BLOCK_SIZE != 0:
        add = BLOCK_SIZE - (count % BLOCK_SIZE)
    else:
        add = 0
    text = value + ("\0".encode() * add)  # 这里的"\0"必须编码成bytes，不然无法和text拼接
    return text


# 将明文用AES加密
def AES_en(data):
    data = pad(data.encode())
    # 创建加密对象
    aes_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
    # 完成加密
    aes_en_str = aes_obj.encrypt(data)
    # 用base64编码一下
    aes_en_str = b64encode(aes_en_str)
    # 最后将密文转化成字符串
    aes_en_str = aes_en_str.decode("utf-8")
    return aes_en_str


def AES_de(data):
    # 解密过程逆着加密过程写
    # 将密文字符串重新编码成二进制形式
    data = data.encode("utf-8")
    # 将base64的编码解开
    data = decodebytes(data)
    # 创建解密对象
    AES_de_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
    # 完成解密
    AES_de_str = AES_de_obj.decrypt(data)
    # 去掉补上的空格
    AES_de_str = AES_de_str.strip()
    # 对明文解码
    AES_de_str = AES_de_str.decode("utf-8")
    return AES_de_str.strip(b'\x00'.decode())


if __name__ == '__main__':
    data = "{'test':'我是一个小小的程序员！'}"
    b = AES_en(data)
    print(f"加密为：{b}")  # python3.6以上的写法
    a = AES_de(b)
    print(f"解密为：{a}")
